%env SODAPY_APPTOKEN = HA1B7dCJquyL8zRLXZ2YlWvNQ
!pip install sodapy
!pip install -U plotly
# !pip install geopandas
import os
from urllib.request import urlopen
import json
import pandas as pd
import numpy as np
from sodapy import Socrata
import matplotlib
import matplotlib.pyplot as plt
import plotly.express as px
# import geopandas as gpd
import folium
def get_dataset(dataset_id):
apptoken = os.environ.get("SODAPY_APPTOKEN") # Anonymous app token
domain = "data.melbourne.vic.gov.au"
client = Socrata(domain, apptoken) # Open Dataset connection
dataresource = client.get_all(dataset_id)
dataset = pd.DataFrame(dataresource)
return dataset
#Fetching dataset
dt_id_seats = "dyqx-cfn5"
dt_id_capacity = "9hjf-8i2d"
# smallAreaLayer_id = "gei8-3w86"
df_seats = get_dataset(dt_id_seats)
df_capacity = get_dataset(dt_id_capacity)
int_cols = ['census_year','industry_anzsic4_code','block_id','number_of_seats']
float_cols = ['x_coordinate', 'y_coordinate']
df_seats[int_cols] = df_seats[int_cols].astype(int)
df_seats[float_cols] = df_seats[float_cols].astype(float)
df_seats = df_seats.convert_dtypes() # convert remaining to string
df_seats = df_seats.dropna(axis=0)
print(f'The shape of number of seatings dataset is {df_seats.shape}.')
df_seats.head(10)
int_cols = ['census_year','block_id','number_of_patrons']
float_cols = ['x_coordinate', 'y_coordinate']
df_capacity[int_cols] = df_capacity[int_cols].astype(int)
df_capacity[float_cols] = df_capacity[float_cols].astype(float)
df_capacity = df_capacity.convert_dtypes() # convert remaining to string
df_capacity = df_capacity.dropna(axis=0)
print(f'The shape of number of patrons(capacity) dataset is {df_capacity.shape}.')
df_capacity.head()
Aggregate statistics of the datasets
# For number of seats
groupbyfields = ['x_coordinate','y_coordinate','street_address','industry_anzsic4_description']
aggregatebyfields = {'number_of_seats': ["sum"]}
seat_stats = pd.DataFrame(df_seats.groupby(groupbyfields, as_index=False).agg(aggregatebyfields))
seat_stats.columns = seat_stats.columns.map(''.join) # flatten column header
seat_stats.rename(columns={
'industry_anzsic4_description':'industry',
'number_of_seatssum': 'number_of_seats',
'x_coordinate': 'lon',
'y_coordinate': 'lat',
},
inplace=True) #rename to match GeoJSON extract
# Convert (x, y)'s to Geopandas POINT's
# seat_stats['geometry'] = gpd.points_from_xy(seat_stats['x_coordinate'], seat_stats['y_coordinate'])
seat_stats['number_of_seats'] = seat_stats['number_of_seats'].astype(int)
print(seat_stats.shape)
seat_stats.head(10)
# For number of seats
groupbyfields = ['x_coordinate','y_coordinate','street_address']
aggregatebyfields = {'number_of_patrons': ["sum"]}
capacity_stats = pd.DataFrame(df_capacity.groupby(groupbyfields, as_index=False).agg(aggregatebyfields))
capacity_stats.columns = capacity_stats.columns.map(''.join) # flatten column header
capacity_stats.rename(columns={
'industry_anzsic4_description':'industry',
'number_of_patronssum': 'number_of_patrons',
'x_coordinate': 'lon',
'y_coordinate': 'lat',
},
inplace=True) #rename to match GeoJSON extract
# Convert (x, y)'s to Geopandas POINT's
# capacity_stats['geometry'] = gpd.points_from_xy(capacity_stats['x_coordinate'], capacity_stats['y_coordinate'])
capacity_stats['number_of_patrons'] = capacity_stats['number_of_patrons'].astype(int)
print(capacity_stats.shape)
capacity_stats.head(10)
Colour mappping for types of industry
# Prepare colour dictionary for industries
keys = list(seat_stats['industry'].unique())
color_range = list(np.linspace(0, 1, len(keys), endpoint=False))
colors = [matplotlib.colors.to_hex(plt.cm.tab20(x)) for x in color_range]
color_dict_industry = dict(zip(keys, colors))
Layer for displaying number of seats
# Number of seats layer:
num_seats = folium.FeatureGroup(name="Number of Seats",
show=True,)
for i in range(0,len(seat_stats)):
circle_styles = {
'fill': True,
'color': color_dict_industry[seat_stats.iloc[i]['industry']],
'weight': 1.5,
# 'fillOpacity': 1
}
html=f"""
<h5>{seat_stats.iloc[i]['street_address']}</h5>
<p>Number of seats: {seat_stats.iloc[i]['number_of_seats']}</p>
<p>Industry: {seat_stats.iloc[i]['industry']}</p>
"""
iframe = folium.IFrame(html=html, width=200, height=200)
popup = folium.Popup(iframe, max_width=2650)
folium.Circle(
location=[seat_stats.iloc[i]['lat'], seat_stats.iloc[i]['lon']],
popup=popup,
radius=float(seat_stats.iloc[i]['number_of_seats'])*0.1,
**circle_styles
).add_to(num_seats)
Layer for displaying number of patrons
# Number of patrons layer:
num_capacity = folium.FeatureGroup(name="Number of Patrons (Capacity) of Bars/taverns/pubs",
show=False,)
for i in range(0,len(capacity_stats)):
circle_styles = {
'fill': True,
'color': color_dict_industry['Pubs, Taverns and Bars'],
'weight': 1.5,
# 'fillOpacity': 1
}
html=f"""
<h5>{capacity_stats.iloc[i]['street_address']}</h5>
<p>Number of Patrons (Capacity): {capacity_stats.iloc[i]['number_of_patrons']}</p>
"""
iframe = folium.IFrame(html=html, width=200, height=200)
popup = folium.Popup(iframe, max_width=2650)
folium.Circle(
location=[capacity_stats.iloc[i]['lat'], capacity_stats.iloc[i]['lon']],
popup=popup,
radius=float(capacity_stats.iloc[i]['number_of_patrons'])*0.1,
**circle_styles
).add_to(num_capacity)
map = folium.Map(location=[-37.813, 144.945], tiles="CartoDB dark_matter", zoom_start=13)
num_seats.add_to(map)
num_capacity.add_to(map)
folium.LayerControl(collapsed=False).add_to(map)
# Show the map
map